package com.obelisco.vista.plantillas;

import java.util.List;
import java.util.Map;

import nextapp.echo2.app.Component;
import nextapp.echo2.extras.app.layout.TabPaneLayoutData;

import com.obelisco.vista.componentes.ComponenteDatosListener;
import com.obelisco.vista.componentes.ComponenteImprimirListener;
import com.obelisco.vista.componentes.TipoFuncion;

public class VentanaDialogoSimple extends VentanaDialogoBase 
{

	//private Vector<ComponenteDatosListener> listeners = new Vector<ComponenteDatosListener>();
	
	private Object objetoEntidad;
	
	@Override
	public Object getObjetoEntidad() {
		// TODO Auto-generated method stub
		return objetoEntidad;
	}		
	
	@Override
	public void inicializar() {
		// TODO Auto-generated method stub		
		distribuirEventoInicializar();
	}

	@Override
	public void onConfirmarCambios(Object objeto, TipoFuncion funcion, String nombre) {
		// TODO Auto-generated method stub
		distribuirEventoConfirmarCambios(objeto, funcion, nombre);
	}

	@Override
	public void onConsultar(Object objeto) {
		// TODO Auto-generated method stub
		distribuirEventoConsultar(objeto);
	}

	@Override
	public void onFuncionPersonalizada(Object objeto, TipoFuncion tipoFuncion, String nombre) {
		// TODO Auto-generated method stub
		distribuirEventoFuncionPersonalizada(objeto, tipoFuncion, nombre);
	}

	@Override
	public void onIncluir(Object objeto) {
		// TODO Auto-generated method stub
		distribuirEventoIncluir(objeto);
	}

	@Override
	public void onModificar(Object objeto) {
		// TODO Auto-generated method stub
		distribuirEventoModificar(objeto);
	}

	@Override
	public boolean onValidarDatos(Object objeto, TipoFuncion funcion, String nombre) {
		// TODO Auto-generated method stub
		return distribuirEventoValidarDatos(objeto,funcion,nombre);
	}

	@Override
	public void setObjetoEntidad(Object objetoEntidad) {
		// TODO Auto-generated method stub
		this.objetoEntidad = objetoEntidad;
		distribuirEventoObjetoEntidad(objetoEntidad);
		
 	}
	

	private void distribuirEventoObjetoEntidad(Object object) {
		for (ComponenteDatosListener l : listeners) {
			l.onObjetoEntidad(object);
		}
	}
	
	private void distribuirEventoIncluir(Object objeto) {
		for (ComponenteDatosListener l : listeners) {
			l.onIncluir(objeto);
		}
	}
	
	private void distribuirEventoModificar(Object objeto) {
		for (ComponenteDatosListener l : listeners) {
			l.onModificar(objeto);
		}
	}

	private void distribuirEventoConsultar(Object objeto) {
		for (ComponenteDatosListener l : listeners) {
			l.onConsultar(objeto);
		}
	}

	private boolean distribuirEventoValidarDatos(Object objeto, TipoFuncion tipo, String nombre) {

		boolean validarDatos = true;

		for (ComponenteDatosListener l : listeners) {
			if (!l.onValidarDatos(objeto, tipo, nombre)) {
				validarDatos = false;
			}
		}

		return validarDatos;
	}

	private void distribuirEventoConfirmarCambios(Object objeto, TipoFuncion tipo, String nombre) {

		for (ComponenteDatosListener l : listeners) {
			l.onConfirmarCambios(objeto, tipo, nombre);
		}

	}

	private void distribuirEventoInicializar() {

		for (ComponenteDatosListener l : listeners) {
			l.onInicializar();
		}

	}
	
	private void distribuirEventoFuncionPersonalizada(Object objeto, TipoFuncion funcion, String nombre) {
		for (ComponenteDatosListener l : listeners) {
			l.onFuncionPersonalizada(objeto, funcion, nombre);
		}
	}
	
	private void distribuirEventoCancelar() {
		for (ComponenteDatosListener l : listeners) {
			l.onCancelar();
		}
	}

	public void addComponenteDatosListener(ComponenteDatosListener listener) {
		listeners.add(listener);
	}
	
	public void addComponenteImprimirListener(ComponenteImprimirListener listenerImprimir) {
		listenersImprimir.add(listenerImprimir);
	}
	
	public void removeCatalogoListener(ComponenteDatosListener listener) {
		listeners.remove(listener);
	}

	public void setComponentesDatos(Map<String, ComponenteDatosListener> componentes) {

		for (String clave : componentes.keySet()) {

			Object componente = componentes.get(clave);

			if (componente instanceof Component) {

				Component component = (Component) componente;

				if (isUsarTab()) {					
					TabPaneLayoutData contenedorLayoutData = new TabPaneLayoutData();
					contenedorLayoutData.setTitle(clave);
					component.setLayoutData(contenedorLayoutData);
				}
				/*else {
					DisplayLayoutData layoutData = new DisplayLayoutData();
					layoutData.setHeight(new ExtentEx("100%"));
					layoutData.setWidth(new ExtentEx("100%"));
					component.setLayoutData(layoutData);
				}*/				
				this.getAreaTrabajo().add(component);				
				addComponenteDatosListener((ComponenteDatosListener) componente);	
								
				Class[] clases = componente.getClass().getInterfaces();
				for (int i = 0; i < clases.length; i++)
				{
					Class claseInterfaz = clases[i];
					if (claseInterfaz == ComponenteImprimirListener.class)
					{
						addComponenteImprimirListener((ComponenteImprimirListener) componente);
					}
				}
			}
		}		
	}

	@Override
	protected void onCancelar() {
		distribuirEventoCancelar();		
	}	
	
}